import sys
import socket
import threading
import time
是否退出=False

try:
    with open('服务端主机地址.张明宇的配置文件','r',encoding='utf-8') as 打开配置文件:
        主机端口=打开配置文件.read().split('\n')
        主机=主机端口[0]
        try:
            端口=int(主机端口[1])
        except ValueError:
            print('发生错误,无法将字符串端口转换成int,请检查配置文件')
            exit()
        print(主机, 端口)
except FileNotFoundError:
    try:
        import easygui
    except NameError:
        print('你尚未安装Python的easygui模块\n请在命令行输入\npip install easygui')
        exit()
    配置内容 = easygui.enterbox(title='请输入',msg='由于并没有在程序的根目录发现配置文件\n接下来我们将帮你创建\n首先请你先填入本地的ip') + '\n' + easygui.enterbox(title='请输入', msg='接下来,请输入服务器在启动时要使用的端口号,注意只能是数字')
    主机和端口 = 配置内容.split('\n')
    主机 = 主机和端口[0]
    try:
        端口 = int(主机和端口[1])
    except ValueError:
        print('发生错误,无法将字符串端口转换成int,请检查配置文件')
        exit()
    with open('服务端主机地址.张明宇的配置文件','w',encoding='utf-8') as 创建配置文件:
        创建配置文件.write(配置内容)
    easygui.msgbox('你已配置完成,如需要更改请在当前目录的配置文件中更改。')

def ping线程():
    while True:
        输入信息 = "ping"
        向客户端发送消息(输入信息)
        time.sleep(2)  # 等待3秒
时间列表=[]
客户端 = []
def 获取时间():
    import struct
    # 服务器地址和端口
    SERVER_ADDRESS = "pool.ntp.org"
    SERVER_PORT = 123

    # 创建UDP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # NTP格式的时间戳，基准时间为1900年
    NTP时间戳 = 2208988800

    # 发送NTP包
    sock.sendto(b'\x1b' + 47 * b'\0', (SERVER_ADDRESS, SERVER_PORT))

    # 接收NTP响应
    接收请求 = sock.recv(1024)

    # 关闭socket
    sock.close()

    # 解析NTP包
    解析包 = struct.unpack('!12I', 接收请求)[10]
    解析包 -= NTP时间戳

    # 转换为标准时间
    标准时间 = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(解析包))

    return 标准时间
print(获取时间())
def 连接客户端(conn, addr):
    客户端.append(conn)
    时间=获取时间()
    print(f"\n新连接的ID为 {addr[1]}从{时间}开始")
    时间列表.append(时间)
    try:
        while True:
            data = conn.recv(1024)
            if not data:
                print(f"\n客户端 {addr[1]} 已断开连接 从{时间列表[客户端.index(conn)]}到{获取时间()}")
                客户端.remove(conn)
                时间列表.pop(客户端.index(conn))
                break

    except Exception as e:
        if 是否退出 == True:
            pass
        else:
            print(f"与客户端 {addr[1]} 的通信中发生错误,可能是断开了连接: {e}")
        try:
            客户端.remove(conn)
            时间列表.pop(客户端.index(conn))
        except ValueError as e:
            pass
    finally:
        conn.close()
def 向客户端发送消息(输入信息):
    for client in list(客户端):  # 使用list()避免在迭代时修改集合
        try:
            client.sendall(输入信息.encode())
        except OSError:
            print("无法向一个客户端发送消息，可能是该客户端已断开连接")
            时间列表.pop(客户端.index(client))
            客户端.remove(client)
        except ConnectionAbortedError:
            print("终止了一个连接")
            时间列表.pop(客户端.index(client))
            客户端.remove(client)
def 主程序():
    global 是否退出,主机,端口
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((主机, 端口))
    server_socket.listen()
    print("服务器启动，等待连接...")

    def accept_connections():
        while True:
            conn, addr = server_socket.accept()
            thread = threading.Thread(target=连接客户端, args=(conn, addr))
            thread.start()

    accept_thread = threading.Thread(target=accept_connections)
    accept_thread.start()
    # 启动ping循环的线程
    启动ping线程 = threading.Thread(target=ping线程)
    启动ping线程.start()
    try:
        while True:
            输入信息 = input("请输入要广播的命令：")
            if 输入信息.lower() == 'break':
                是否退出=True
            else:
                是否退出=False

            向客户端发送消息(输入信息)
    finally:
        server_socket.close()



主程序()
